package com.ithiema.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.util.BeanUtil;
import com.ithiema.reggie.common.CustomException;
import com.ithiema.reggie.dto.DishDto;
import com.ithiema.reggie.entity.Dish;
import com.ithiema.reggie.entity.DishFlavor;
import com.ithiema.reggie.mapper.DishMapper;
import com.ithiema.reggie.service.DishFlavorService;
import com.ithiema.reggie.service.DishService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 菜品业务层实现类
 *
 * @author wangxiao
 * @since 2022/11/2 20:29
 */
@Service
@Transactional // 当操作两张表及两张表以上的时候,增删改,对数据有修改的时候,需要开启事务
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    /**
     * 更新数据
     *
     * @param dto
     */
    @Override
    public void updateWithFlavor(DishDto dto) {
//1.先更新dish表
        Dish dish = new Dish();
//        dto -->  dish
        BeanUtils.copyProperties(dto,dish);
//        /调用service 的 updateById方法更新
        this.updateById(dish);
//        2.删除原来菜品的口味
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(DishFlavor::getDishId,dish.getId());
        // delete from dish_flavor where dish_id = dishId
        this.flavorService.remove(queryWrapper);
        // 3.把dishId重新赋值给flavors口味
//        for (DishFlavor flavor : dto.getFlavors()) {
//            flavor.setDishId(dish.getId());
//        }
        dto.getFlavors().forEach(item -> item.setDishId(dish.getId()));
//    添加新的口味
        this.flavorService.saveBatch(dto.getFlavors());
    }



    /**
     * 根据id获取菜品及菜品口味
     *
     * @param id
     */
    @Override
    public DishDto getByIdWithFlavor(Long id) {
//        查询菜品的基本信息
        Dish dish = this.getById(id);
//        校验判断
        if (dish == null){
            throw new CustomException("传入的参数不正确");
        }
//        构建dishDto，并赋值
        DishDto dishDto = new DishDto();
//        dish --> dishDto
//
        BeanUtils.copyProperties(dish,dishDto);
//        通过id查询当前菜品对应的口味信息，赋值给dishDto对象，是要去菜品口味表中查询
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DishFlavor::getDishId,dish.getId());
//        返回的是当前菜品的口味信息
        List<DishFlavor> dishFlavorList = this.flavorService.list(queryWrapper);
//        赋值给对象
        dishDto.setFlavors(dishFlavorList);

        return dishDto;
    }

    @Autowired
    private DishFlavorService flavorService;
    @Override
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        // 当新增\修改\删除输出的时候, 并且 当操作两张表或者是两张表以上的时候,要记得开启事务
        // 1 保存菜品基本信息
//        保存菜品的基本信息  单一原则
        Dish dish = new Dish();
//        第一个参数是源数据  第二个参数是目标,BeanUtils.copyProperties可以做到类复制
        BeanUtils.copyProperties(dishDto,dish);
        this.save(dish);
//        2.保存菜品口味信息，需要获得这个菜品的id
//        菜皮id
        Long dishId = dish.getId();
        /*
         // 保存菜品口味信息
        // 保存菜品口味之前,要给菜品口味的dishId赋值.
        // 如果要是不赋值的话,那么这些口味实际上就不属于任何菜品了.那和我们保存这次菜品信息的操作
        // 也就没有关联
        // size大于0,就代表前端传入了口味信息
         */
        if (dishDto.getFlavors().size() > 0){
            for (DishFlavor flavor : dishDto.getFlavors()) {
//                菜品id
                flavor.setDishId(dishId);
            }
//           调用保存菜品口味信息
            this.flavorService.saveBatch(dishDto.getFlavors());
        }
    }
}
